package com.example.examsystem.repository;

import com.example.examsystem.model.Role;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 角色仓库接口
 */
@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {
    
    /**
     * 根据角色名称查找角色
     * @param name 角色名称
     * @return 角色对象
     */
    Optional<Role> findByName(String name);
    
    /**
     * 根据状态查找角色
     * @param status 角色状态
     * @return 角色列表
     */
    List<Role> findByStatus(Integer status);
    
    /**
     * 检查角色名称是否存在
     * @param name 角色名称
     * @return 是否存在
     */
    boolean existsByName(String name);
    
    /**
     * 检查角色名称是否存在且ID不匹配
     * @param name 角色名称
     * @param id 角色ID
     * @return 是否存在且ID不匹配
     */
    boolean existsByNameAndIdNot(String name, Long id);
    
    /**
     * 分页查询角色（支持按名称和描述筛选）
     * @param name 角色名称（模糊查询）
     * @param description 角色描述（模糊查询）
     * @param pageable 分页参数
     * @return 分页角色数据
     */
    @Query("""
       SELECT r FROM Role r
       WHERE
           (:name IS NULL OR :name = '' OR LOWER(r.name) LIKE LOWER(CONCAT('%', :name, '%'))) AND
           (:description IS NULL OR :description = '' OR LOWER(r.description) LIKE LOWER(CONCAT('%', :description, '%')))
       """)
    Page<Role> findByQuery(@Param("name") String name, 
                          @Param("description") String description, 
                          Pageable pageable);
    
    /**
     * 按创建时间排序查询所有角色
     * @return 角色列表
     */
    List<Role> findAllByOrderByCreatedAt();
}


